package com.medisoft.managedbean;

import com.medisoft.dao.ProductoDao;
import com.medisoft.dao.TipoProductoDao;
import com.medisoft.dao.UnidadMedidaDao;
import com.medisoft.model.Producto;
import com.medisoft.model.TipoProducto;
import com.medisoft.model.UnidadMedida;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.event.CellEditEvent;
import org.primefaces.event.RowEditEvent;

@ManagedBean(name = "productoMB")
@ViewScoped
public class ProductoMB implements Serializable {

    private Producto producto;
    private Producto productoSelected;

    private List<Producto> productos;
    private List<Producto> lst_prod;
    private List<TipoProducto> opcionTipoProd;
    private List<UnidadMedida> opcionUnidadMed;

    private String b_codProd;

    @EJB
    ProductoDao productoDao;
    @EJB
    TipoProductoDao tipoProductoDao;
    @EJB
    UnidadMedidaDao unidadMedidaDao;

    @PostConstruct
    public void init() {
        producto = new Producto();
        productos = productoDao.getAll();

        opcionTipoProd = tipoProductoDao.getOpcionTipoProd();
        opcionUnidadMed = unidadMedidaDao.getOpcionUnidadMed();
    }

    public List<Producto> autoCompleteProducto(String query) {
        lst_prod = productoDao.getAutocompleteCodProd(query);
        return lst_prod;
    }

    public void buscarProductos() {
        productos = productoDao.getBuscarProductos(b_codProd);
    }

    public void obtenerProducto() {
        producto = productoDao.obtenerProductoPorCodigo(Integer.parseInt(producto.getId().toString()));
    }

    public void darBajaProducto() {
        boolean rpta = productoDao.darBajaProducto(productoSelected);
        productos = productoDao.getAll();
        if (rpta) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_INFO, "El producto fue dado de baja", null);
            FacesContext.getCurrentInstance().addMessage(null, fm);
            RequestContext.getCurrentInstance().update("frmBandejaProductos:msgBandejaProductos");
            RequestContext.getCurrentInstance().update("frmBandejaProductos:tblListaProductos");
        } else {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo dar de baja al producto", null);
            FacesContext.getCurrentInstance().addMessage(null, fm);
            RequestContext.getCurrentInstance().update("frmBandejaProductos:msgBandejaProductos");
        }
    }

    public void actualizarProducto() {
        boolean rpta = productoDao.actualizarProducto(producto);
        productos = productoDao.getAll();
        if (rpta) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_INFO, "El producto fue actualizado", null);
            FacesContext.getCurrentInstance().addMessage(null, fm);
            RequestContext.getCurrentInstance().execute("wvEdicionProducto.hide()");
            RequestContext.getCurrentInstance().update("frmBandejaProductos:msgBandejaProductos");
            RequestContext.getCurrentInstance().update("frmBandejaProductos:tblListaProductos");
        } else {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo actualizar el producto", null);
            FacesContext.getCurrentInstance().addMessage(null, fm);
            RequestContext.getCurrentInstance().update("frmBandejaProductos:msgBandejaProductos");
        }
    }

    public void onRowEdit(RowEditEvent event) {
        Producto producto = ((Producto) event.getObject());
        producto.saveIt();
        FacesMessage msg = new FacesMessage("Producto Editado", ((Producto) event.getObject()).getCodigo());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowCancel(RowEditEvent event) {
        FacesMessage msg = new FacesMessage("Edicion Cancelada", ((Producto) event.getObject()).getCodigo());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if (newValue != null && !newValue.equals(oldValue)) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cambio ", "Antes: " + oldValue + ", Ahora:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    // metodos de acceso
    public Producto getProducto() {
        return producto;
    }

    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public Producto getProductoSelected() {
        return productoSelected;
    }

    public void setProductoSelected(Producto productoSelected) {
        this.productoSelected = productoSelected;
    }

    public List<Producto> getProductos() {
        return productos;
    }

    public void setProductos(List<Producto> productos) {
        this.productos = productos;
    }

    public List<Producto> getLst_prod() {
        return lst_prod;
    }

    public void setLst_prod(List<Producto> lst_prod) {
        this.lst_prod = lst_prod;
    }

    public List<TipoProducto> getOpcionTipoProd() {
        return opcionTipoProd;
    }

    public void setOpcionTipoProd(List<TipoProducto> opcionTipoProd) {
        this.opcionTipoProd = opcionTipoProd;
    }

    public List<UnidadMedida> getOpcionUnidadMed() {
        return opcionUnidadMed;
    }

    public void setOpcionUnidadMed(List<UnidadMedida> opcionUnidadMed) {
        this.opcionUnidadMed = opcionUnidadMed;
    }

    public String getB_codProd() {
        return b_codProd;
    }

    public void setB_codProd(String b_codProd) {
        this.b_codProd = b_codProd;
    }

}
